package tools

import (
	"bufio"
	"fmt"
	"os"
	"time"
)

// 读取文件的最后 n 行
func tail(filename string, n int, last_line int) ([]string, int, error) {
	file, err := os.Open(filename)
	if err != nil {
		return nil, 0, fmt.Errorf("无法打开文件: %v", err)
	}
	defer file.Close()

	// 使用 scanner 读取文件
	scanner := bufio.NewScanner(file)
	var lines []string
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		return nil, 0, fmt.Errorf("读取文件失败: %v", err)
	}

	// 计算起始行号

	start := len(lines) - n
	if last_line != 0 {
		start = last_line
	}
	if start < 0 {
		start = 0
	}
	if start >= len(lines) {
		return nil, start, fmt.Errorf("文件没有新数据")
	}
	last_line = len(lines)
	// 返回最后 n 行
	return lines[start:], last_line, nil
}

func (t Command) Tail() {
	if len(os.Args) < 4 {
		fmt.Println("请求参数有误！请参考：yt tail {line_num} {filepath} ")
		return
	}

	filename := os.Args[3]
	n := 0
	_, err := fmt.Sscanf(os.Args[2], "%d", &n)
	if err != nil || n <= 0 {
		fmt.Println("行数必须是正整数")
		return
	}

	// 读取文件的最后 n 行
	last_line := 0
	for {
		lines, last_line2, err := tail(filename, n, last_line)
		if err != nil && last_line2 == 0 {
			fmt.Println("错误:", err)
			return
		}

		// 输出结果
		for _, line := range lines {
			fmt.Println(line)
		}

		time.Sleep(time.Second * 2)
		last_line = last_line2
	}
}
